package br.com.rotary.manager.pesquisar;

import br.com.rotary.manager.generico.ManagerPesquisarGenerico;
import br.com.rotary.modelo.Grupo;
import br.com.rotary.modelo.Usuario;
import br.com.rotary.servico.GrupoServico;
import br.com.rotary.servico.UsuarioServico;
import br.com.rotary.utilitario.Msg;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DualListModel;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarUsuario extends ManagerPesquisarGenerico<Usuario> {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    GrupoServico grupoServico;
    private List<Grupo> grupos;
    private List<Grupo> gruposVisualizar;
    private List<Grupo> grupoSelecionado;
    private Usuario usuario;
    private Usuario usuarioExcluir;
    private List<Usuario> usuarios;
    private String usuarioId;
    private String senhaAntiga;
    private String senhaNova;
    private String senhaConfirmar;
    private DualListModel<Grupo> dualGrupo;
    private List<Grupo> gruposSelec;
    private boolean loginExistente;
    private String loginAntigo;

    @Override
    public void init() {
        setServico(usuarioServico);

        this.usuario = new Usuario();
        this.senhaAntiga = "";

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.usuarioId = params.get("usuario");

        if (this.usuarioId != null) {
            pesquisarUsuario(Long.parseLong(this.usuarioId));
        }
    }

    @Override
    public void pesquisar() {
        entidadePesquisar = this.usuario;

        getSearchResults().setFirst(0);
        onLoadModel();
    }

    public void pesquisarUsuario(Long id) {
        this.usuario = usuarioServico.pesquisar(id);

        if (this.usuario != null && this.usuario.getGrupos() != null && !this.usuario.getGrupos().isEmpty()) {
            this.gruposSelec = grupoServico.pesquisar(this.usuario);
        } else {
            this.gruposSelec = new ArrayList<Grupo>();
        }

        List<Grupo> target = grupoServico.pesquisarTodos();
        target.removeAll(this.usuario.getGrupos());
        this.dualGrupo = new DualListModel<Grupo>(target, this.usuario.getGrupos());

        this.loginAntigo = this.usuario.getLogin();
    }

    public void atualizar() {
        try {
            this.usuario.setGrupos(this.dualGrupo.getTarget());
            usuarioServico.atualizar(this.usuario);

            pesquisarUsuario(this.usuario.getId());

            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public void atualizarSenha() {
        try {

            if (this.usuario.getSenha().equals(Usuario.encryptPassword(this.senhaAntiga))) {

                if (this.senhaNova.equals(this.senhaConfirmar)) {

                    this.usuario.setSenha(Usuario.encryptPassword(this.senhaNova));
                    this.usuarioServico.atualizar(this.usuario);
                    Msg.messagemInfoRedirect(Msg.SuccessFull, "pesquisarusuario.xhtml");

                } else {
                    Msg.messagemWarn("As senhas não conferem !");
                }

            } else {
                Msg.messagemWarn("Senha atual está incorreta !");
            }
        } catch (Exception e) {
            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    @Override
    public void limpar() {
        init();
    }

    @Override
    public void remover() {
        try {
            this.usuarioExcluir.setAtivo(Boolean.FALSE);
            this.usuarioServico.atualizar(this.usuarioExcluir);

            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            System.err.println(e);
        }
    }

    public void existLogin() {
        if (!this.usuario.getLogin().equals(this.loginAntigo)) {
            this.loginExistente = usuarioServico.existLogin(usuario.getLogin());
        } else {
            this.loginExistente = false;
        }
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public List<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(List<Grupo> grupos) {
        this.grupos = grupos;
    }

    public List<Grupo> getGrupoSelecionado() {
        return grupoSelecionado;
    }

    public void setGrupoSelecionado(List<Grupo> grupoSelecionado) {
        this.grupoSelecionado = grupoSelecionado;
    }

    public List<Grupo> getGruposVisualizar() {
        return gruposVisualizar;
    }

    public void setGruposVisualizar(List<Grupo> gruposVisualizar) {
        this.gruposVisualizar = gruposVisualizar;
    }

    public String getSenhaAntiga() {
        return senhaAntiga;
    }

    public void setSenhaAntiga(String senhaAntiga) {
        this.senhaAntiga = senhaAntiga;
    }

    public String getSenhaNova() {
        return senhaNova;
    }

    public void setSenhaNova(String senhaNova) {
        this.senhaNova = senhaNova;
    }

    public String getSenhaConfirmar() {
        return senhaConfirmar;
    }

    public void setSenhaConfirmar(String senhaConfirmar) {
        this.senhaConfirmar = senhaConfirmar;
    }

    public DualListModel<Grupo> getDualGrupo() {
        return dualGrupo;
    }

    public void setDualGrupo(DualListModel<Grupo> dualGrupo) {
        this.dualGrupo = dualGrupo;
    }

    public List<Grupo> getGruposSelec() {
        return gruposSelec;
    }

    public void setGruposSelec(List<Grupo> gruposSelec) {
        this.gruposSelec = gruposSelec;
    }

    public Usuario getUsuarioExcluir() {
        return usuarioExcluir;
    }

    public void setUsuarioExcluir(Usuario usuarioExcluir) {
        this.usuarioExcluir = usuarioExcluir;
    }

    public boolean isLoginExistente() {
        return loginExistente;
    }

    public void setLoginExistente(boolean loginExistente) {
        this.loginExistente = loginExistente;
    }
}
